import json
import logging
import os
from typing import Any

from aiogram import Bot, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import Dispatcher
from aiogram.types import InputFile, KeyboardButton, ReplyKeyboardMarkup
from aiogram.utils import executor

import scraper_tasks

bot = Bot(token=input("Enter your bot's token in telegram/Введите токен вашего бота в телеграмм :"))
dp = Dispatcher(bot,storage=MemoryStorage())
logging.basicConfig(level=logging.INFO)


if os.path.exists('users.json'):
        with open("users.json", "r",encoding="utf-8") as read_file:
            users = json.load(read_file)
else:
    users={}

def run():
    executor.start_polling(dp)


@dp.errors_handler()
async def handle(update, exception) -> Any:
        logging.exception(
            "Cause unexpected exception %s",exception )
        
        
        
@dp.message_handler(commands=['start'],state='*')
async def process_start_command(message: types.Message):
    await dp.current_state(user=message.from_user.id).set_state('menu')
    logging.info(
                f'Пользователь {message.from_user.id} получил статус { await dp.current_state(user=message.from_user.id).get_state()}')
    
    
    if users.get(str(message.from_user.id))==None:
        users[str(message.from_user.id)] ={}
        users[str(message.from_user.id)]['task']=0
        users[str(message.from_user.id)]['tasks'] = []
        users[str(message.from_user.id)]['anwsers'] = []
        users[str(message.from_user.id)]['avg']={}
        users[str(message.from_user.id)]['prev_result']={}
        users[str(message.from_user.id)]['avg']['MathPro']=0.0
        users[str(message.from_user.id)]['avg']['Math'] = 0.0

        users[str(message.from_user.id)]['prev_result']['MathPro']=0.0
        users[str(message.from_user.id)]['prev_result']['Math'] = 0.0

    else:
        if users[str(message.from_user.id)]['tasks']!=[]:
            for i in users[str(message.from_user.id)]['tasks']:
                if os.path.exists(i[2]) and os.path.exists(i[1]):
                    os.remove(i[2]); os.remove(i[1])
        
        users[str(message.from_user.id)]['task'] = 0
        users[str(message.from_user.id)]['tasks'] = []
        users[str(message.from_user.id)]['anwsers'] = []
    
    if os.path.exists('users.json'):
        os.remove('users.json')
    with open('users.json', 'w',encoding="utf-8") as f:
    
        json.dump(users,f)
    # копочки
    button_do_tasks = KeyboardButton('Решить вариант')
    button_stats = KeyboardButton('Статистика')
    button_about = KeyboardButton('Об боте')
    #
    menu = ReplyKeyboardMarkup().row(button_do_tasks).row(button_stats ,button_about)
    await bot.send_message(message.chat.id,"Здравствуйте! "
                        "\nЯ бот, который поможет вам подготовиться к ЕГЭ!"
                        "\nЯ могу предлагать варианты ЕГЭ для решения и показывать статистику ваших успехов."
                        "\nИспользуйте меню, чтобы начать подготовку."
                        "", reply_markup=menu)
@dp.message_handler(text=['Об боте'],state='menu')
async def about(message: types.Message):
    await bot.send_message(message.chat.id,"Здравствуйте! "
                        "\nЯ бот, который поможет вам подготовиться к ЕГЭ!"
                        "\nЯ могу предлагать варианты ЕГЭ для решения и показывать статистику ваших успехов."
                        "\nИспользуйте меню, чтобы начать подготовку."
                        "")
@dp.message_handler(text=['Статистика'],state='menu')
async def stats(message: types.Message):
    
    await bot.send_message(message.chat.id, f"=====Математика(Проф.)=====\n"
                                            f"Ваш предыдущий балл: {users[str(message.from_user.id)]['prev_result']['MathPro']}\n"
                                            f"Ваш средний балл: {users[str(message.from_user.id)]['avg']['MathPro']}\n"
                                            f"Вы на {[*dict(sorted(users.items(), key=lambda item: item[1]['avg']['MathPro'],reverse=True))].index(str(message.from_user.id))+1} месте по среднему баллу за Математику(Проф.)"
                                            f"\n\n"
                                            f"=====Математика=====\n"
                                            f"Ваш предыдущий балл: {users[str(message.from_user.id)]['prev_result']['Math']}\n"
                                            f"Ваш средний балл: {users[str(message.from_user.id)]['avg']['Math']}\n"
                                            f"Вы на {[*dict(sorted(users.items(), key=lambda item: item[1]['avg']['Math'],reverse=True))].index(str(message.from_user.id))+1} месте по среднему баллу за Математику"
                                            )


@dp.message_handler(text=['Решить вариант'],state='menu')
async def options(message: types.Message):
    await dp.current_state(user=message.from_user.id).set_state('choosing_subject')
    logging.log(0,
                f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    button_math_pro = KeyboardButton('Математика(Проф.)')
    button_math = KeyboardButton('Математика')
    button_back =KeyboardButton('В меню')
    menu = ReplyKeyboardMarkup().row(button_math_pro ,button_math)
    menu.add(button_back)
    await bot.send_message(message.chat.id,"Выбирите предмет", reply_markup=menu)

@dp.message_handler(text=['В меню'],state=['choosing_subject','got_option_math_pro_specific','choosing_math_pro','got_random_math_pro','checked_math_pro_specific',"checked_math_pro_random","checked_math_random",'checked_math_specific','got_random_math'])
async def options(message: types.Message):
   
    await process_start_command(message)
    

    
    
@dp.message_handler(text=['Математика'],state='choosing_subject')
async def choosing_math(message: types.Message):
    await dp.current_state(user=message.from_user.id).set_state('choosing_math')
    logging.info(
                f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    button_option = KeyboardButton('Вариант по номеру')
    button_random = KeyboardButton('Случайный вариант')
    button_back = KeyboardButton('В меню')
    menu = ReplyKeyboardMarkup().add(button_option).add(button_random)
    menu.add(button_back)
    await bot.send_message(message.chat.id,"Выбирите нужный Вам тип варианта", reply_markup=menu)
    
# рандомный вариант
@dp.message_handler(text=['Случайный вариант'],state=['choosing_math'])
async def math_random(message: types.Message):
    await dp.current_state(user=message.from_user.id).set_state('getting_math_numbers')
    logging.info(
        f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    await bot.send_message(message.chat.id, "Введите кол-во номеров в варианте от 1 до 20",
                           reply_markup=types.ReplyKeyboardRemove())
@dp.message_handler(state='getting_math_numbers')
async def responser(message: types.Message):
    await dp.current_state(user=message.from_user.id).set_state('getting_tasks_math_random')
    logging.info(
        f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    if not message.text.isdigit():
        await math_random(message)
    else:
        if int(message.text) <= 20 and int(message.text) >= 1:
            await message.reply('Получаю вариант...')
            users[str(message.from_user.id)]['prev_result']['Math'] = 0
            users[str(message.from_user.id)]['tasks'] = await scraper_tasks.get_options_math(int(message.text),
                                                                                     message.from_user.id)
            await dp.current_state(user=message.from_user.id).set_state('got_random_math')
            await bot.send_message(message.chat.id, "Получен вариант.",
                                   reply_markup=ReplyKeyboardMarkup(one_time_keyboard=True).add(
                                       KeyboardButton('Начать решение')).add(KeyboardButton('В меню')))
        else:
            await math_random(message)

@dp.message_handler(text='Начать решение',state='got_random_math')
async def start_doing_tasks_math_random(message: types.Message):
    await dp.current_state(user=message.from_user.id).set_state('doing_tasks_numbers_math_random')
    logging.info(
        f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    if len(users[str(message.from_user.id)]['tasks'])>users[str(message.from_user.id)]['task']:
           
            await bot.send_message(message.chat.id, f"Задание {users[str(message.from_user.id)]['task'] + 1}")
            try:

                await bot.send_photo(message.chat.id, InputFile(
                    path_or_bytesio='tasks\\task_' + str(users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                        message.from_user.id) + '.png'))
            except:
                await bot.send_document(message.chat.id, InputFile(
                    path_or_bytesio='tasks\\task_' + str(users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                        message.from_user.id) + '.png'))
            await dp.current_state(user=message.from_user.id).set_state('waiting_for_answer_math_random')
            
    else:
        await dp.current_state(user=message.from_user.id).set_state('math_anwsered_random')

        menu = ReplyKeyboardMarkup().add(KeyboardButton('Далее'))
        users[str(message.from_user.id)]['task'] = 0

        await bot.send_message(message.chat.id,"Дальше Вы увидите решения на задания",reply_markup=menu)




@dp.message_handler(state='waiting_for_answer_math_random')
async def responser(message:types.Message):
    users[str(message.from_user.id)]['task'] += 1
    users[str(message.from_user.id)]['anwsers'].append(message.text)
    await start_doing_tasks_math_random(message)

@dp.message_handler(text='Далее',state='math_anwsered_random')
async def checking_math_random(message: types.Message):
    await dp.current_state(user=message.from_user.id).set_state('checking_math_random')
    logging.info(
        f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    if users[str(message.from_user.id)]['task'] < 20 and len(users[str(message.from_user.id)]['tasks'])>users[str(message.from_user.id)]['task']:
        await bot.send_message(message.chat.id, f"Задание {users[str(message.from_user.id)]['task'] + 1}",
                               reply_markup=types.ReplyKeyboardRemove())
        if (users[str(message.from_user.id)]['anwsers'][users[str(message.from_user.id)]['task']].find(users[str(message.from_user.id)]['tasks'][users[str(message.from_user.id)]['task']][0]) !=-1):
            users[str(message.from_user.id)]['prev_result']['Math']+=1

        await bot.send_message(message.chat.id,
                                   f"Ваш ответ: {users[str(message.from_user.id)]['anwsers'][users[str(message.from_user.id)]['task']]}\n"
                                   f"Правильный ответ: {users[str(message.from_user.id)]['tasks'][users[str(message.from_user.id)]['task']][0]}\n"
                                   f"Ваши баллы: {users[str(message.from_user.id)]['prev_result']['Math']}",
                                   reply_markup=types.ReplyKeyboardRemove())
        try:
                await bot.send_photo(message.chat.id, InputFile(
                    path_or_bytesio='tasks\\full_answer_' + str(users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                        message.from_user.id) + '.png'),reply_markup=ReplyKeyboardMarkup().add(KeyboardButton('Далее')))
        except:
                await bot.send_document(message.chat.id, InputFile(
                    path_or_bytesio='tasks\\full_answer_' + str(users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                        message.from_user.id) + '.png'),reply_markup=ReplyKeyboardMarkup().add(KeyboardButton('Далее')))

        await dp.current_state(user=message.from_user.id).set_state('waiting_for_skip_checked_math_random')

        
    else:
        await dp.current_state(user=message.from_user.id).set_state('checked_math_random')
        logging.info(
            f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
        users[str(message.from_user.id)]['avg']['Math']=(users[str(message.from_user.id)]['avg']['Math']+users[str(message.from_user.id)]['prev_result']['Math'])/2
        await bot.send_message(message.chat.id, f"Ваш балл за этот вариант: {users[str(message.from_user.id)]['prev_result']['Math']}\n"
                                                f"Ваш средний балл сейчас составляет {users[str(message.from_user.id)]['avg']['Math']}",
                               reply_markup=ReplyKeyboardMarkup().add(KeyboardButton('В меню')))

@dp.message_handler(text="Далее",state='waiting_for_skip_checked_math_random')
async def responser(message: types.Message):
    users[str(message.from_user.id)]['task'] += 1
    await checking_math_random(message)

#


#### вариант по номеру
@dp.message_handler(text=['Вариант по номеру'],state=['choosing_math','getting_option_math'])
async def math_specific(message: types.Message):
    await dp.current_state(user=message.from_user.id).set_state('getting_math_number_specific')
    logging.info(
                f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    await bot.send_message(message.chat.id, "Введите номер варианта от 1 до 15",reply_markup=types.ReplyKeyboardRemove())


@dp.message_handler(state='getting_math_number_specific')
async def responser(message: types.Message):

    await dp.current_state(user=message.from_user.id).set_state('getting_option_math_specific')
    logging.info(
                f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    if not message.text.isdigit():
        await math_specific(message)
    else:
        if int(message.text)<=15 and int(message.text)>=1:
            users[str(message.from_user.id)]['prev_result']['Math'] = 0
            await message.reply('Получаю вариант...')
            users[str(message.from_user.id)]['tasks']=await scraper_tasks.get_option_math(int(message.text),message.from_user.id)
            await dp.current_state(user=message.from_user.id).set_state('got_option_math_specific')
            await bot.send_message(message.chat.id, "Получен вариант.",
                                   reply_markup=ReplyKeyboardMarkup(one_time_keyboard=True).add(KeyboardButton('Начать решение')).add(KeyboardButton('В меню')))
        else:
            await math_specific(message)

@dp.message_handler(text='Начать решение',state='got_option_math_specific')
async def start_doing_tasks_math_specific(message: types.Message):
        await dp.current_state(user=message.from_user.id).set_state('doing_tasks_math_specific')

        if users[str(message.from_user.id)]['task']<20:
            await bot.send_message(message.chat.id, f"Задание {users[str(message.from_user.id)]['task']+1}",
                                   )

            try:

                await bot.send_photo(message.chat.id,InputFile(path_or_bytesio='tasks\\task_' + str(users[str(message.from_user.id)]['task']+1) + "_" + str(message.from_user.id) + '.png'))
            except:
                await bot.send_document(message.chat.id,InputFile(path_or_bytesio='tasks\\task_' + str(users[str(message.from_user.id)]['task']+1) + "_" + str(message.from_user.id) + '.png'))
            await dp.current_state(user=message.from_user.id).set_state('waiting_for_answer_math_specific')
            


        else:

            await dp.current_state(user=message.from_user.id).set_state('math_anwsered_specific')

            menu = ReplyKeyboardMarkup().add(KeyboardButton('Далее'))
            users[str(message.from_user.id)]['task']=0
            await bot.send_message(message.chat.id, "Дальше Вы увидите решения на задания", reply_markup=menu)


@dp.message_handler(state='waiting_for_answer_math_specific')
async def responser(message:types.Message):
    users[str(message.from_user.id)]['task'] += 1
    users[str(message.from_user.id)]['anwsers'].append(message.text)
    await start_doing_tasks_math_specific(message)

@dp.message_handler(text='Далее',state='math_anwsered_specific')
async def checking_math_specific(message: types.Message):
    await dp.current_state(user=message.from_user.id).set_state('checking_math_specific')
    logging.info(
        f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    if users[str(message.from_user.id)]['task'] < 20:
        await bot.send_message(message.chat.id, f"Задание {users[str(message.from_user.id)]['task'] + 1}",
                               reply_markup=types.ReplyKeyboardRemove())
        if (users[str(message.from_user.id)]['anwsers'][users[str(message.from_user.id)]['task']].find(users[str(message.from_user.id)]['tasks'][users[str(message.from_user.id)]['task']][0]) !=-1):
            users[str(message.from_user.id)]['prev_result']['Math']+=1

        await bot.send_message(message.chat.id,
                                   f"Ваш ответ: {users[str(message.from_user.id)]['anwsers'][users[str(message.from_user.id)]['task']]}\n"
                                   f"Правильный ответ: {users[str(message.from_user.id)]['tasks'][users[str(message.from_user.id)]['task']][0]}\n"
                                   f"Ваши баллы: {users[str(message.from_user.id)]['prev_result']['Math']}",
                                   reply_markup=types.ReplyKeyboardRemove())
        try:
                await bot.send_photo(message.chat.id, InputFile(
                    path_or_bytesio='tasks\\full_answer_' + str(users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                        message.from_user.id) + '.png'),reply_markup=ReplyKeyboardMarkup().add(KeyboardButton('Далее')))
        except:
                await bot.send_document(message.chat.id, InputFile(
                    path_or_bytesio='tasks\\full_answer_' + str(users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                        message.from_user.id) + '.png'),reply_markup=ReplyKeyboardMarkup().add(KeyboardButton('Далее')))

        await dp.current_state(user=message.from_user.id).set_state('waiting_for_skip_checked_math_specific')

        
    else:
        await dp.current_state(user=message.from_user.id).set_state('checked_math_specific')
        logging.info(
            f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
        users[str(message.from_user.id)]['avg']['Math']=(users[str(message.from_user.id)]['avg']['Math']+users[str(message.from_user.id)]['prev_result']['Math'])/2
        await bot.send_message(message.chat.id, f"Ваш балл за этот вариант: {users[str(message.from_user.id)]['prev_result']['Math']}\n"
                                                f"Ваш средний балл сейчас составляет {users[str(message.from_user.id)]['avg']['Math']}",
                               reply_markup=ReplyKeyboardMarkup().add(KeyboardButton('В меню')))

@dp.message_handler(text="Далее",state='waiting_for_skip_checked_math_specific')
async def responser(message: types.Message):
    users[str(message.from_user.id)]['task'] += 1
    await checking_math_specific(message)

######
    
    
    
    
    
    
    
    
    
    
    
    
@dp.message_handler(text=['Математика(Проф.)'],state='choosing_subject')
async def choosing_math_pro(message: types.Message):
    await dp.current_state(user=message.from_user.id).set_state('choosing_math_pro')
    logging.info(
                f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    button_option = KeyboardButton('Вариант по номеру')
    button_random = KeyboardButton('Случайный вариант')
    button_back = KeyboardButton('В меню')
    menu = ReplyKeyboardMarkup().add(button_option).add(button_random)
    menu.add(button_back)
    await bot.send_message(message.chat.id,"Выбирите нужный Вам тип варианта", reply_markup=menu)
    
    
    
    
    
    
    
    
    
#Математика ПРОФ
    
# рандомный вариант
@dp.message_handler(text=['Случайный вариант'],state=['choosing_math_pro'])
async def math_pro_random(message: types.Message):
    await dp.current_state(user=message.from_user.id).set_state('getting_math_pro_numbers')
    logging.info(
        f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    await bot.send_message(message.chat.id, "Введите кол-во номеров в варианте от 1 до 19",
                           reply_markup=types.ReplyKeyboardRemove())
@dp.message_handler(state='getting_math_pro_numbers')
async def responser(message: types.Message):
    await dp.current_state(user=message.from_user.id).set_state('getting_tasks_math_pro_random')
    logging.info(
        f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    if not message.text.isdigit():
        await math_pro_random(message)
    else:
        if int(message.text) <= 19 and int(message.text) >= 1:
            await message.reply('Получаю вариант...')
            users[str(message.from_user.id)]['prev_result']['MathPro'] = 0
            users[str(message.from_user.id)]['tasks'] = await scraper_tasks.get_options_math_pro(int(message.text),
                                                                                     message.from_user.id)
            await dp.current_state(user=message.from_user.id).set_state('got_random_math_pro')
            await bot.send_message(message.chat.id, "Получен вариант.",
                                   reply_markup=ReplyKeyboardMarkup(one_time_keyboard=True).add(
                                       KeyboardButton('Начать решение')).add(KeyboardButton('В меню')))
        else:
            await math_pro_random(message)

@dp.message_handler(text='Начать решение',state='got_random_math_pro')
async def start_doing_tasks_math_pro_random(message: types.Message):
    await dp.current_state(user=message.from_user.id).set_state('doing_tasks_numbers_math_pro_random')
    logging.info(
        f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    if len(users[str(message.from_user.id)]['tasks'])>users[str(message.from_user.id)]['task']:
           
            await bot.send_message(message.chat.id, f"Задание {users[str(message.from_user.id)]['task'] + 1}")
            try:

                await bot.send_photo(message.chat.id, InputFile(
                    path_or_bytesio='tasks\\task_' + str(users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                        message.from_user.id) + '.png'))
            except:
                await bot.send_document(message.chat.id, InputFile(
                    path_or_bytesio='tasks\\task_' + str(users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                        message.from_user.id) + '.png'))
            if users[str(message.from_user.id)]['task']<12:
                await dp.current_state(user=message.from_user.id).set_state('waiting_for_answer_math_pro_random')
            else:


                await bot.send_message(message.chat.id, f"Отвечать не нужно!",
                                       reply_markup=ReplyKeyboardMarkup().add(KeyboardButton('Далее')))

                await dp.current_state(user=message.from_user.id).set_state('waiting_for_skip_math_pro_random')
    else:
        await dp.current_state(user=message.from_user.id).set_state('math_pro_anwsered_random')

        menu = ReplyKeyboardMarkup().add(KeyboardButton('Далее'))
        users[str(message.from_user.id)]['task'] = 0

        await bot.send_message(message.chat.id,"Дальше Вы увидите решения на задания\nТак же Вам потребуется проверить самостоятельно задания с 13 по 19 и ввести свои баллы по заданным критериям",reply_markup=menu)


@dp.message_handler(text='Далее',state='waiting_for_skip_math_pro_random')
async def responser(message:types.Message):
    users[str(message.from_user.id)]['task'] += 1
    await start_doing_tasks_math_pro_random(message)

@dp.message_handler(state='waiting_for_answer_math_pro_random')
async def responser(message:types.Message):
    users[str(message.from_user.id)]['task'] += 1
    users[str(message.from_user.id)]['anwsers'].append(message.text)
    await start_doing_tasks_math_pro_random(message)

@dp.message_handler(text='Далее',state='math_pro_anwsered_random')
async def checking_math_pro_random(message: types.Message):
    await dp.current_state(user=message.from_user.id).set_state('checking_math_pro_random')
    logging.info(
        f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    if users[str(message.from_user.id)]['task'] < 19 and len(users[str(message.from_user.id)]['tasks'])>users[str(message.from_user.id)]['task']:
        await bot.send_message(message.chat.id, f"Задание {users[str(message.from_user.id)]['task'] + 1}",
                               reply_markup=types.ReplyKeyboardRemove())
        if users[str(message.from_user.id)]['task'] < 12:
            if (users[str(message.from_user.id)]['anwsers'][users[str(message.from_user.id)]['task']].find(users[str(message.from_user.id)]['tasks'][users[str(message.from_user.id)]['task']][0]) !=-1):

                users[str(message.from_user.id)]['prev_result']['MathPro']+=1

            await bot.send_message(message.chat.id,
                                   f"Ваш ответ: {users[str(message.from_user.id)]['anwsers'][users[str(message.from_user.id)]['task']]}\n"
                                   f"Правильный ответ: {users[str(message.from_user.id)]['tasks'][users[str(message.from_user.id)]['task']][0]}\n"
                                   f"Ваши баллы: {users[str(message.from_user.id)]['prev_result']['MathPro']}",
                                   reply_markup=types.ReplyKeyboardRemove())
            try:
                await bot.send_photo(message.chat.id, InputFile(
                    path_or_bytesio='tasks\\full_answer_' + str(users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                        message.from_user.id) + '.png'),reply_markup=ReplyKeyboardMarkup().add(KeyboardButton('Далее')))
            except:
                await bot.send_document(message.chat.id, InputFile(
                    path_or_bytesio='tasks\\full_answer_' + str(users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                        message.from_user.id) + '.png'),reply_markup=ReplyKeyboardMarkup().add(KeyboardButton('Далее')))

            await dp.current_state(user=message.from_user.id).set_state('waiting_for_skip_checked_math_pro_random')

        else:
            await bot.send_message(message.chat.id, f"Это задание творческое,Вам требуется оценить свою работу по критериям и написать свой балл за это задание\n",
                                   reply_markup=types.ReplyKeyboardRemove())
            if users[str(message.from_user.id)]['task']<15:
                await bot.send_message(message.chat.id,
                                       "Обоснованно получены верные ответы в обоих пунктах – 2 балла.\n\n"
                                       "Обоснованно получен верный ответ в пункте а или б, ИЛИ получены неверные ответы из-за вычислительной ошибки, но при этом имеется верная последовательность всех шагов решения обоих пунктов: пункта а и пункта б – 1 балл.\n\n"
                                       "Решение не соответствует ни одному из критериев,перечисленных выше – 0 баллов.",
                                       reply_markup=types.ReplyKeyboardRemove())
                try:
                    await bot.send_photo(message.chat.id, InputFile(
                        path_or_bytesio='tasks\\full_answer_' + str(
                            users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                            message.from_user.id) + '.png'))
                except:
                    await bot.send_document(message.chat.id, InputFile(
                        path_or_bytesio='tasks\\full_answer_' + str(
                            users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                            message.from_user.id) + '.png'))
                await bot.send_message(message.chat.id, f"Отправьте Ваш балл за это задание",reply_markup=types.ReplyKeyboardRemove())
                await dp.current_state(user=message.from_user.id).set_state('getting_answer_math_pro_random')
                logging.info(
                    f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
            if users[str(message.from_user.id)]['task']>=15 and users[str(message.from_user.id)]['task']<=16:
                await bot.send_message(message.chat.id,
                                       "Имеется верное доказательство утверждения пункта а, и обоснованно получен верный ответ в пункте б – 3 балла.\n\n"
                                       "Получен обоснованный ответ в пункте б, ИЛИ имеется верное доказательство утверждения пункта а, и при обоснованном решении пункта б получен неверный ответ из-за арифметической ошибки – 2 балла.\n\n"
                                       "Имеется верное доказательство утверждения пункта а,ИЛИ при обоснованном решении пункта б получен неверный ответ из-за арифметической ошибки, ИЛИ обоснованно получен верный ответ в пункте б с использованием утверждения пункта а, при этом пункт а не выполнен – 1 балл.\n\n"
                                       "Решение не соответствует ни одному из критериев,приведённых выше – 0 баллов.",
                                       reply_markup=types.ReplyKeyboardRemove())
                try:
                    await bot.send_photo(message.chat.id, InputFile(
                        path_or_bytesio='tasks\\full_answer_' + str(
                            users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                            message.from_user.id) + '.png'))
                except:
                    await bot.send_document(message.chat.id, InputFile(
                        path_or_bytesio='tasks\\full_answer_' + str(
                            users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                            message.from_user.id) + '.png'))
                await bot.send_message(message.chat.id, f"Отправьте Ваш балл за это задание",reply_markup=types.ReplyKeyboardRemove())
                await dp.current_state(user=message.from_user.id).set_state('getting_answer_math_pro_random')
                logging.info(
                    f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
            if users[str(message.from_user.id)]['task']>=17 and users[str(message.from_user.id)]['task']<=18:
                await bot.send_message(message.chat.id,
                                       "Верно получены все перечисленные результаты– обоснованное решение пункта а;\n– обоснованное решение пункта б;\n– искомая оценка в пункте в;\n– пример в пункте в, обеспечивающий точность предыдущейо ценки 1 – 4 балла.\n\n"
                                       "Верно получены три из перечисленных результатов – 3 балла\n\n"
                                       "Верно получены два из перечисленных результатов – 2 балла\n\n"
                                       "Верно получен один из перечисленных результатов – 1 балл.\n\n"
                                       "Решение не соответствует ни одному из критериев,приведённых выше 0 баллов.",
                                       reply_markup=types.ReplyKeyboardRemove())
                try:
                    await bot.send_photo(message.chat.id, InputFile(
                        path_or_bytesio='tasks\\full_answer_' + str(
                            users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                            message.from_user.id) + '.png'))
                except:
                    await bot.send_document(message.chat.id, InputFile(
                        path_or_bytesio='tasks\\full_answer_' + str(
                            users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                            message.from_user.id) + '.png'))
                await bot.send_message(message.chat.id, f"Отправьте Ваш балл за это задание",reply_markup=types.ReplyKeyboardRemove())
                await dp.current_state(user=message.from_user.id).set_state('getting_answer_math_pro_random')
                logging.info(
                    f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    else:
        await dp.current_state(user=message.from_user.id).set_state('checked_math_pro_random')
        logging.info(
            f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
        users[str(message.from_user.id)]['avg']['MathPro']=(users[str(message.from_user.id)]['avg']['MathPro']+users[str(message.from_user.id)]['prev_result']['MathPro'])/2
        await bot.send_message(message.chat.id, f"Ваш балл за этот вариант: {users[str(message.from_user.id)]['prev_result']['MathPro']}\n"
                                                f"Ваш средний балл сейчас составляет {users[str(message.from_user.id)]['avg']['MathPro']}",
                               reply_markup=ReplyKeyboardMarkup().add(KeyboardButton('В меню')))

@dp.message_handler(text="Далее",state='waiting_for_skip_checked_math_pro_random')
async def responser(message: types.Message):
    users[str(message.from_user.id)]['task'] += 1
    await checking_math_pro_random(message)
@dp.message_handler(state='getting_answer_math_pro_random')
async def responser(message: types.Message):
    if message.text.isdigit():
        if users[str(message.from_user.id)]['task']>=12 and users[str(message.from_user.id)]['task']<=14:
            if int(message.text)<=2:
                users[str(message.from_user.id)]['prev_result']['MathPro']+=int(message.text)
            else:
                await bot.send_message(message.chat.id, f"Отправьте Ваш балл за это задание",
                                       reply_markup=types.ReplyKeyboardRemove())
        if users[str(message.from_user.id)]['task']>=15 and users[str(message.from_user.id)]['task']<=16:
            if int(message.text)<=3:
                users[str(message.from_user.id)]['prev_result']['MathPro']+=int(message.text)
            else:
                await bot.send_message(message.chat.id, f"Отправьте Ваш балл за это задание",
                                       reply_markup=types.ReplyKeyboardRemove())
        if users[str(message.from_user.id)]['task']>=17 and users[str(message.from_user.id)]['task']<=18:
            if int(message.text)<=4:
                users[str(message.from_user.id)]['prev_result']['MathPro']+=int(message.text)
            else:
                await bot.send_message(message.chat.id, f"Отправьте Ваш балл за это задание",
                                       reply_markup=types.ReplyKeyboardRemove())

        users[str(message.from_user.id)]['task'] += 1
        await checking_math_pro_random(message)
    else:
        await bot.send_message(message.chat.id, f"Отправьте Ваш балл за это задание",
                               reply_markup=types.ReplyKeyboardRemove())

#


#### вариант по номеру
@dp.message_handler(text=['Вариант по номеру'],state=['choosing_math_pro','getting_option_math_pro_specific'])
async def math_pro_specific(message: types.Message):
    await dp.current_state(user=message.from_user.id).set_state('getting_math_pro_number_specific')
    logging.info(
                f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    await bot.send_message(message.chat.id, "Введите номер варианта от 1 до 15",reply_markup=types.ReplyKeyboardRemove())


@dp.message_handler(state='getting_math_pro_number_specific')
async def responser(message: types.Message):

    await dp.current_state(user=message.from_user.id).set_state('getting_option_math_pro_specific')
    logging.info(
                f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    if not message.text.isdigit():
        await math_pro_specific(message)
    else:
        if int(message.text)<=15 and int(message.text)>=1:
            users[str(message.from_user.id)]['prev_result']['MathPro'] = 0
            await message.reply('Получаю вариант...')
            users[str(message.from_user.id)]['tasks']=await scraper_tasks.get_option_math_pro(int(message.text),message.from_user.id)
            await dp.current_state(user=message.from_user.id).set_state('got_option_math_pro_specific')
            await bot.send_message(message.chat.id, "Получен вариант.",
                                   reply_markup=ReplyKeyboardMarkup(one_time_keyboard=True).add(KeyboardButton('Начать решение')).add(KeyboardButton('В меню')))
        else:
            await math_pro_specific(message)

@dp.message_handler(text='Начать решение',state='got_option_math_pro_specific')
async def start_doing_tasks_math_pro_specific(message: types.Message):
        await dp.current_state(user=message.from_user.id).set_state('doing_tasks_math_pro_specific')

        if users[str(message.from_user.id)]['task']<19:
            await bot.send_message(message.chat.id, f"Задание {users[str(message.from_user.id)]['task']+1}",
                                   )

            try:

                await bot.send_photo(message.chat.id,InputFile(path_or_bytesio='tasks\\task_' + str(users[str(message.from_user.id)]['task']+1) + "_" + str(message.from_user.id) + '.png'))
            except:
                await bot.send_document(message.chat.id,InputFile(path_or_bytesio='tasks\\task_' + str(users[str(message.from_user.id)]['task']+1) + "_" + str(message.from_user.id) + '.png'))
            if users[str(message.from_user.id)]['task']<12:
                await dp.current_state(user=message.from_user.id).set_state('waiting_for_answer_math_pro_specific')
            else:


                await bot.send_message(message.chat.id, f"Отвечать не нужно!",
                                       reply_markup=ReplyKeyboardMarkup().add(KeyboardButton('Далее')))

                await dp.current_state(user=message.from_user.id).set_state('waiting_for_skip_math_pro_specific')


        else:

            await dp.current_state(user=message.from_user.id).set_state('math_pro_anwsered_specific')

            menu = ReplyKeyboardMarkup().add(KeyboardButton('Далее'))
            users[str(message.from_user.id)]['task']=0
            await bot.send_message(message.chat.id, "Дальше Вы увидите решения на задания\nТак же Вам потребуется проверить самостоятельно задания с 13 по 19 и ввести свои баллы по заданным критериям", reply_markup=menu)

@dp.message_handler(text='Далее',state='waiting_for_skip_math_pro_specific')
async def responser(message:types.Message):
    users[str(message.from_user.id)]['task'] += 1
    await start_doing_tasks_math_pro_specific(message)

@dp.message_handler(state='waiting_for_answer_math_pro_specific')
async def responser(message:types.Message):
    users[str(message.from_user.id)]['task'] += 1
    users[str(message.from_user.id)]['anwsers'].append(message.text)
    await start_doing_tasks_math_pro_specific(message)

@dp.message_handler(text='Далее',state='math_pro_anwsered_specific')
async def checking_math_pro_specific(message: types.Message):
    await dp.current_state(user=message.from_user.id).set_state('checking_math_pro_specific')
    logging.info(
        f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    if users[str(message.from_user.id)]['task'] < 19:
        await bot.send_message(message.chat.id, f"Задание {users[str(message.from_user.id)]['task'] + 1}",
                               reply_markup=types.ReplyKeyboardRemove())
        if users[str(message.from_user.id)]['task'] < 12:
            if (users[str(message.from_user.id)]['anwsers'][users[str(message.from_user.id)]['task']].find(users[str(message.from_user.id)]['tasks'][users[str(message.from_user.id)]['task']][0]) !=-1):

                users[str(message.from_user.id)]['prev_result']['MathPro']+=1

            await bot.send_message(message.chat.id,
                                   f"Ваш ответ: {users[str(message.from_user.id)]['anwsers'][users[str(message.from_user.id)]['task']]}\n"
                                   f"Правильный ответ: {users[str(message.from_user.id)]['tasks'][users[str(message.from_user.id)]['task']][0]}\n"
                                   f"Ваши баллы: {users[str(message.from_user.id)]['prev_result']['MathPro']}",
                                   reply_markup=types.ReplyKeyboardRemove())
            try:
                await bot.send_photo(message.chat.id, InputFile(
                    path_or_bytesio='tasks\\full_answer_' + str(users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                        message.from_user.id) + '.png'),reply_markup=ReplyKeyboardMarkup().add(KeyboardButton('Далее')))
            except:
                await bot.send_document(message.chat.id, InputFile(
                    path_or_bytesio='tasks\\full_answer_' + str(users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                        message.from_user.id) + '.png'),reply_markup=ReplyKeyboardMarkup().add(KeyboardButton('Далее')))

            await dp.current_state(user=message.from_user.id).set_state('waiting_for_skip_checked_math_pro_specific')

        else:
            await bot.send_message(message.chat.id, f"Это задание творческое,Вам требуется оценить свою работу по критериям и написать свой балл за это задание\n",
                                   reply_markup=types.ReplyKeyboardRemove())
            if users[str(message.from_user.id)]['task']<15:
                await bot.send_message(message.chat.id,
                                       "Обоснованно получены верные ответы в обоих пунктах – 2 балла.\n\n"
                                       "Обоснованно получен верный ответ в пункте а или б, ИЛИ получены неверные ответы из-за вычислительной ошибки, но при этом имеется верная последовательность всех шагов решения обоих пунктов: пункта а и пункта б – 1 балл.\n\n"
                                       "Решение не соответствует ни одному из критериев,перечисленных выше – 0 баллов.",
                                       reply_markup=types.ReplyKeyboardRemove())
                try:
                    await bot.send_photo(message.chat.id, InputFile(
                        path_or_bytesio='tasks\\full_answer_' + str(
                            users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                            message.from_user.id) + '.png'))
                except:
                    await bot.send_document(message.chat.id, InputFile(
                        path_or_bytesio='tasks\\full_answer_' + str(
                            users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                            message.from_user.id) + '.png'))
                await bot.send_message(message.chat.id, f"Отправьте Ваш балл за это задание",reply_markup=types.ReplyKeyboardRemove())
                await dp.current_state(user=message.from_user.id).set_state('getting_answer_math_pro_specific')
                logging.info(
                    f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
            if users[str(message.from_user.id)]['task']>=15 and users[str(message.from_user.id)]['task']<=16:
                await bot.send_message(message.chat.id,
                                       "Имеется верное доказательство утверждения пункта а, и обоснованно получен верный ответ в пункте б – 3 балла.\n\n"
                                       "Получен обоснованный ответ в пункте б, ИЛИ имеется верное доказательство утверждения пункта а, и при обоснованном решении пункта б получен неверный ответ из-за арифметической ошибки – 2 балла.\n\n"
                                       "Имеется верное доказательство утверждения пункта а,ИЛИ при обоснованном решении пункта б получен неверный ответ из-за арифметической ошибки, ИЛИ обоснованно получен верный ответ в пункте б с использованием утверждения пункта а, при этом пункт а не выполнен – 1 балл.\n\n"
                                       "Решение не соответствует ни одному из критериев,приведённых выше – 0 баллов.",
                                       reply_markup=types.ReplyKeyboardRemove())
                try:
                    await bot.send_photo(message.chat.id, InputFile(
                        path_or_bytesio='tasks\\full_answer_' + str(
                            users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                            message.from_user.id) + '.png'))
                except:
                    await bot.send_document(message.chat.id, InputFile(
                        path_or_bytesio='tasks\\full_answer_' + str(
                            users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                            message.from_user.id) + '.png'))
                await bot.send_message(message.chat.id, f"Отправьте Ваш балл за это задание",reply_markup=types.ReplyKeyboardRemove())
                await dp.current_state(user=message.from_user.id).set_state('getting_answer_math_pro_specific')
                logging.info(
                    f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
            if users[str(message.from_user.id)]['task']>=17 and users[str(message.from_user.id)]['task']<=18:
                await bot.send_message(message.chat.id,
                                       "Верно получены все перечисленные результаты– обоснованное решение пункта а;\n– обоснованное решение пункта б;\n– искомая оценка в пункте в;\n– пример в пункте в, обеспечивающий точность предыдущейо ценки 1 – 4 балла.\n\n"
                                       "Верно получены три из перечисленных результатов – 3 балла\n\n"
                                       "Верно получены два из перечисленных результатов – 2 балла\n\n"
                                       "Верно получен один из перечисленных результатов – 1 балл.\n\n"
                                       "Решение не соответствует ни одному из критериев,приведённых выше 0 баллов.",
                                       reply_markup=types.ReplyKeyboardRemove())
                try:
                    await bot.send_photo(message.chat.id, InputFile(
                        path_or_bytesio='tasks\\full_answer_' + str(
                            users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                            message.from_user.id) + '.png'))
                except:
                    await bot.send_document(message.chat.id, InputFile(
                        path_or_bytesio='tasks\\full_answer_' + str(
                            users[str(message.from_user.id)]['task'] + 1) + "_" + str(
                            message.from_user.id) + '.png'))
                await bot.send_message(message.chat.id, f"Отправьте Ваш балл за это задание",reply_markup=types.ReplyKeyboardRemove())
                await dp.current_state(user=message.from_user.id).set_state('getting_answer_math_pro_specific')
                logging.info(
                    f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
    else:
        await dp.current_state(user=message.from_user.id).set_state('checked_math_pro_specific')
        logging.info(
            f'Пользователь {message.from_user.id} получил статус {await dp.current_state(user=message.from_user.id).get_state()}')
        users[str(message.from_user.id)]['avg']['MathPro']=(users[str(message.from_user.id)]['avg']['MathPro']+users[str(message.from_user.id)]['prev_result']['MathPro'])/2
        await bot.send_message(message.chat.id, f"Ваш балл за этот вариант: {users[str(message.from_user.id)]['prev_result']['MathPro']}\n"
                                                f"Ваш средний балл сейчас составляет {users[str(message.from_user.id)]['avg']['MathPro']}",
                               reply_markup=ReplyKeyboardMarkup().add(KeyboardButton('В меню')))

@dp.message_handler(text="Далее",state='waiting_for_skip_checked_math_pro_specific')
async def responser(message: types.Message):
    users[str(message.from_user.id)]['task'] += 1
    await checking_math_pro_specific(message)
@dp.message_handler(state='getting_answer_math_pro_specific')
async def responser(message: types.Message):
    if message.text.isdigit():
        if users[str(message.from_user.id)]['task']>=12 and users[str(message.from_user.id)]['task']<=14:
            if int(message.text)<=2:
                users[str(message.from_user.id)]['prev_result']['MathPro']+=int(message.text)
            else:
                await bot.send_message(message.chat.id, f"Отправьте Ваш балл за это задание",
                                       reply_markup=types.ReplyKeyboardRemove())
        if users[str(message.from_user.id)]['task']>=15 and users[str(message.from_user.id)]['task']<=16:
            if int(message.text)<=3:
                users[str(message.from_user.id)]['prev_result']['MathPro']+=int(message.text)
            else:
                await bot.send_message(message.chat.id, f"Отправьте Ваш балл за это задание",
                                       reply_markup=types.ReplyKeyboardRemove())
        if users[str(message.from_user.id)]['task']>=17 and users[str(message.from_user.id)]['task']<=18:
            if int(message.text)<=4:
                users[str(message.from_user.id)]['prev_result']['MathPro']+=int(message.text)
            else:
                await bot.send_message(message.chat.id, f"Отправьте Ваш балл за это задание",
                                       reply_markup=types.ReplyKeyboardRemove())

        users[str(message.from_user.id)]['task'] += 1
        await checking_math_pro_specific(message)
    else:
        await bot.send_message(message.chat.id, f"Отправьте Ваш балл за это задание",
                               reply_markup=types.ReplyKeyboardRemove())
######
